1
NULLの罠を超えて
AI013Lesson 2
00:00

CスタイルのマクロからC++の型安全なリテラルへの移行は、言語の使いやすさにおいて根本的な変化をもたらし、 「NULLの罠」 ゼロマクロの曖昧さが静かに論理エラーを引き起こすという問題を解決する。

1. オーバーロード解像度の失敗

レガシースタンダード(C++98)では、 NULL はしばしば 0として定義される。オーバーロードされた関数に渡された場合、コンパイラは NULL を整数として解釈する。これは次のコードで確認できる。

if (std::is_same<decltype(NULL), decltype(0)>::value)
std::cout << "NULLは整数です";

2. nullptrの解決策

C++11では nullptrというキーワードが導入され、その型は std::nullptr_tである。マクロとは異なり、整数型(ブール型を除く)に暗黙的に変換できないため、ポインタ専用のオーバーロードが正しく選ばれる。

レガシーの罠foo(NULL)foo(int) を呼び出す現代の修正foo(nullptr)foo(char*) を呼び出す

3. リンクおよび相互運用性

現代のC++では extern "C" を用いて、Cコード(例: gccでコンパイルされたもの)とのリンク時に名前マングリングを防ぐ必要がある。この境界での型安全なポインタの維持は非常に重要である。

$$\text{std::nullptr\_t} \neq \text{int}$$

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>